home *** CD-ROM | disk | FTP | other *** search
/ Delphi Anthology / aDELPHI.iso / Runimage / Delphi50 / Source / Property Editors / midreg.pas < prev    next >
Pascal/Delphi Source File  |  1999-08-11  |  22KB  |  740 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Visual Component Library         }
  5. {                                                       }
  6. {       Copyright (c) 1997,99 Inprise Corporation       }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit MidReg;
  11.  
  12. interface
  13.  
  14. uses
  15.   Classes, DmDesigner, DsDesign, MConnect, MidasCon, CorbaCon, DBClient, Provider,
  16.   ActiveX, ComObj, ShlObj, FldLinks, CDSEdit, DBReg, DBConsts, DsgnIntf, Windows,
  17.   Forms, SysUtils, DsnDBCst, MidConst, DataBkr, SConnect, MtsRdm, CorbaRdm,
  18.   ObjBrkr, Dialogs, Controls, DB, DMForm,
  19.   CustomModuleEditors,
  20.   ParentageSupport, DsnDB,
  21.   ModelViews, ModelPrimitives, DataModelViews, DataModelSupport;
  22.  
  23. { TCDSFieldLinkProperty }
  24.  
  25. type
  26.   TCDSFieldLinkProperty = class(TFieldLinkProperty)
  27.   private
  28.     FCDS: TClientDataSet;
  29.   protected
  30.     function GetIndexFieldNames: string; override;
  31.     function GetMasterFields: string; override;
  32.     procedure SetIndexFieldNames(const Value: string); override;
  33.     procedure SetMasterFields(const Value: string); override;
  34.   public
  35.     procedure Edit; override;
  36.   end;
  37.  
  38.   { object brokers }
  39.  
  40.   TCustomObjectBrokerSprig = class(TSprigAtRoot)
  41.   end;
  42.  
  43.   TSimpleObjectBrokerSprig = class(TCustomObjectBrokerSprig)
  44.   public
  45.     function AnyProblems: Boolean; override;
  46.   end;
  47.  
  48.   { connections }
  49.  
  50.   TCustomRemoteServerSprig = class(TSprig)
  51.   end;
  52.  
  53.   TDispatchConnectionSprig = class(TCustomRemoteServerSprig)
  54.   end;
  55.  
  56.   TStreamedConnectionSprig = class(TDispatchConnectionSprig)
  57.   end;
  58.  
  59.   TWebConnectionSprig = class(TStreamedConnectionSprig)
  60.   public
  61.     class function ParentProperty: string; override;
  62.     function AnyProblems: Boolean; override;
  63.   end;
  64.  
  65.   TSocketConnectionSprig = class(TStreamedConnectionSprig)
  66.   public
  67.     class function ParentProperty: string; override;
  68.     function AnyProblems: Boolean; override;
  69.   end;
  70.  
  71.   TCOMConnectionSprig = class(TDispatchConnectionSprig)
  72.   public
  73.     function AnyProblems: Boolean; override;
  74.   end;
  75.  
  76.   TDCOMConnectionSprig = class(TCOMConnectionSprig)
  77.   public
  78.     class function ParentProperty: string; override;
  79.   end;
  80.  
  81.   TOLEnterpriseConnectionSprig = class(TCOMConnectionSprig)
  82.   end;
  83.  
  84.   // TMidasConnectionSprig is handled by TDCOMConnectionSprig
  85.   // TRemoteServerSprig is handled by TDCOMConnectionSprig
  86.  
  87.   TCorbaConnectionSprig = class(TCustomRemoteServerSprig)
  88.   public
  89.     function AnyProblems: Boolean; override;
  90.   end;
  91.  
  92.   { providers }
  93.  
  94.   TCustomProviderSprig = class(TSprig)
  95.   end;
  96.  
  97.   TDataSetProviderSprig = class(TCustomProviderSprig)
  98.   public
  99.     class function ParentProperty: string; override;
  100.   end;
  101.  
  102.   // TProviderSprig is handled by TDataSetProviderSprig
  103.  
  104.   TClientDataSetSprig = class(TDataSetSprig)
  105.   public
  106.     procedure FigureParent; override;
  107.     function AnyProblems: Boolean; override;
  108.     function DragDropTo(AItem: TSprig): Boolean; override;
  109.     function DragOverTo(AItem: TSprig): Boolean; override;
  110.     class function PaletteOverTo(AParent: TSprig; AClass: TClass): Boolean; override;
  111.     function GetDSDesignerClass: TDSDesignerClass; override;
  112.     function Caption: string; override;
  113.   end;
  114.  
  115.   TClientDataSetIsland = class(TDataSetIsland)
  116.   public
  117.     function VisibleTreeParent: Boolean; override;
  118.   end;
  119.  
  120.   TClientDataSetMasterDetailBridge = class(TMasterDetailBridge)
  121.   public
  122.     function CanEdit: Boolean; override;
  123.     function Caption: string; override;
  124.     class function OmegaIslandClass: TIslandClass; override;
  125.     class function GetOmegaSource(AItem: TPersistent): TDataSource; override;
  126.     class procedure SetOmegaSource(AItem: TPersistent; ADataSource: TDataSource); override;
  127.     function Edit: Boolean; override;
  128.   end;
  129.  
  130. procedure Register;
  131.  
  132. implementation
  133.  
  134. type
  135.  
  136. { TCDSDesigner }
  137.  
  138.   TCDSDesigner = class(TDSDesigner)
  139.   private
  140.     FPacketRecords: Integer;
  141.   public
  142.     procedure BeginUpdateFieldDefs; override;
  143.     procedure EndUpdateFieldDefs; override;
  144.     function SupportsAggregates: Boolean; override;
  145.     function SupportsInternalCalc: Boolean; override;
  146.   end;
  147.  
  148. procedure TCDSDesigner.BeginUpdateFieldDefs;
  149. begin
  150.   FPacketRecords := 0;
  151.   if not DataSet.Active then
  152.   begin
  153.     DataSet.FieldDefs.Updated := False;
  154.     FPacketRecords := (DataSet as TClientDataSet).PacketRecords;
  155.     if FPacketRecords <> 0 then
  156.       (DataSet as TClientDataSet).PacketRecords := 0;
  157.   end;
  158.   inherited BeginUpdateFieldDefs;
  159. end;
  160.  
  161. procedure TCDSDesigner.EndUpdateFieldDefs;
  162. begin
  163.   inherited EndUpdateFieldDefs;
  164.   if FPacketRecords <> 0 then
  165.     (DataSet as TClientDataSet).PacketRecords := FPacketRecords;
  166. end;
  167.  
  168. function TCDSDesigner.SupportsAggregates: Boolean;
  169. begin
  170.   Result := True;
  171. end;
  172.  
  173. function TCDSDesigner.SupportsInternalCalc: Boolean;
  174. begin
  175.   Result := True;
  176. end;
  177.  
  178. { TClientDataSetEditor }
  179.  
  180. type
  181.   TClientDataSetEditor = class(TDataSetEditor)
  182.   private
  183.     FCanCreate: Boolean;
  184.   protected
  185.     function GetDSDesignerClass: TDSDesignerClass; override;
  186.   public
  187.     procedure ExecuteVerb(Index: Integer); override;
  188.     function GetVerb(Index: Integer): string; override;
  189.     function GetVerbCount: Integer; override;
  190.   end;
  191.  
  192. function TClientDataSetEditor.GetDSDesignerClass: TDSDesignerClass;
  193. begin
  194.   Result := TCDSDesigner;
  195. end;
  196.  
  197. procedure TClientDataSetEditor.ExecuteVerb(Index: Integer);
  198. begin
  199.   if Index <= inherited GetVerbCount - 1 then
  200.     inherited ExecuteVerb(Index) else
  201.   begin
  202.     Dec(Index, inherited GetVerbCount);
  203.     if (Index > 2) and not FCanCreate then Inc(Index);
  204.     case Index of
  205.       0: begin
  206.            TClientDataSet(Component).FetchParams;
  207.            Designer.Modified;
  208.          end;
  209.       1: if EditClientDataSet(TClientDataSet(Component), Designer) then
  210.            Designer.Modified;
  211.       2: if LoadFromFile(TClientDataSet(Component)) then Designer.Modified;
  212.       3: begin
  213.            TClientDataSet(Component).CreateDataSet;
  214.            Designer.Modified;
  215.          end;
  216.       4: SaveToFile(TClientDataSet(Component));
  217.       5: begin
  218.            TClientDataSet(Component).Data := NULL;
  219.            Designer.Modified;
  220.          end;
  221.     end;
  222.   end;
  223. end;
  224.  
  225. function TClientDataSetEditor.GetVerb(Index: Integer): string;
  226. begin
  227.   if Index <= inherited GetVerbCount - 1 then
  228.     Result := inherited GetVerb(Index) else
  229.   begin
  230.     Dec(Index, inherited GetVerbCount);
  231.     if (Index > 2) and not FCanCreate then Inc(Index);
  232.     case Index of
  233.       0: Result := SFetchParams;
  234.       1: Result := SClientDSAssignData;
  235.       2: Result := SLoadFromFile;
  236.       3: Result := SCreateDataSet;
  237.       4: Result := SSaveToFile;
  238.       5: Result := SClientDSClearData;
  239.     end;
  240.   end;
  241. end;
  242.  
  243. function TClientDataSetEditor.GetVerbCount: Integer;
  244. begin
  245.   Result := inherited GetVerbCount + 3;
  246.   FCanCreate := False;
  247.   with TClientDataset(Component) do
  248.   begin
  249.     if Active or (DataSize > 0) then Inc(Result, 2);
  250.     FCanCreate := not Active and ((FieldCount > 0) or (FieldDefs.Count > 0));
  251.     if FCanCreate then Inc(Result, 1);
  252.   end;
  253. end;
  254.  
  255. { TComputerNameProperty }
  256.  
  257. type
  258.   TComputerNameProperty = class(TStringProperty)
  259.     function GetAttributes: TPropertyAttributes; override;
  260.     procedure Edit; override;
  261.   end;
  262.  
  263. function TComputerNameProperty.GetAttributes: TPropertyAttributes;
  264. begin
  265.   Result := inherited GetAttributes + [paDialog];
  266. end;
  267.  
  268. procedure TComputerNameProperty.Edit;
  269. var
  270.   BrowseInfo: TBrowseInfo;
  271.   ItemIDList: PItemIDList;
  272.   ComputerName: array[0..MAX_PATH] of Char;
  273.   Title: string;
  274.   WindowList: Pointer;
  275.   Result: Boolean;
  276. begin
  277.   if Failed(SHGetSpecialFolderLocation(Application.Handle, CSIDL_NETWORK, ItemIDList)) then
  278.     raise Exception.CreateRes(@SComputerNameDialogNotSupported);
  279.   FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  280.   BrowseInfo.hwndOwner := Application.Handle;
  281.   BrowseInfo.pidlRoot := ItemIDList;
  282.   BrowseInfo.pszDisplayName := ComputerName;
  283.   Title := sSelectRemoteServer;
  284.   BrowseInfo.lpszTitle := PChar(Pointer(Title));
  285.   BrowseInfo.ulFlags := BIF_BROWSEFORCOMPUTER;
  286.   WindowList := DisableTaskWindows(0);
  287.   try
  288.     Result := SHBrowseForFolder(BrowseInfo) <> nil;
  289.   finally
  290.     EnableTaskWindows(WindowList);
  291.   end;
  292.   if Result then SetValue(ComputerName);
  293. end;
  294.  
  295. { TProviderNameProperty }
  296.  
  297. type
  298.   TProviderNameProperty = class(TStringProperty)
  299.     function GetAttributes: TPropertyAttributes; override;
  300.     procedure GetValues(Proc: TGetStrProc); override;
  301.   end;
  302.  
  303. function TProviderNameProperty.GetAttributes: TPropertyAttributes;
  304. begin
  305.   Result := inherited GetAttributes + [paValueList, paSortList];
  306. end;
  307.  
  308. type
  309.   TServerProtectedAccess = class(TCustomRemoteServer); // Allows us to call protected methods.
  310.  
  311. procedure TProviderNameProperty.GetValues(Proc: TGetStrProc);
  312. var
  313.   I: Integer;
  314.   Dataset: TClientDataSet;
  315.   RemoteServer: TCustomRemoteServer;
  316. begin
  317.   DataSet := (GetComponent(0) as TClientDataSet);
  318.   RemoteServer := DataSet.RemoteServer;
  319.   if RemoteServer <> nil then
  320.     TServerProtectedAccess(RemoteServer).GetProviderNames(Proc)
  321.   else
  322.     if Assigned(DataSet.Owner) then
  323.     with DataSet.Owner do
  324.       for I := 0 to ComponentCount - 1 do
  325.         if Components[I] is TCustomProvider then
  326.           Proc(Components[I].Name);
  327. end;
  328.  
  329. { TServerNameProperty }
  330.  
  331. type
  332.   TServerNameProperty = class(TStringProperty)
  333.     function AutoFill: Boolean; override;
  334.     function GetAttributes: TPropertyAttributes; override;
  335.     procedure GetValues(Proc: TGetStrProc); override;
  336.   end;
  337.  
  338. function TServerNameProperty.AutoFill: Boolean; 
  339. begin
  340.   Result := False;
  341. end;
  342.  
  343. function TServerNameProperty.GetAttributes: TPropertyAttributes;
  344. begin
  345.   Result := inherited GetAttributes + [paValueList, paSortList];
  346. end;
  347.  
  348. type
  349.   TConnectionAccess = class(TCustomRemoteServer);
  350.  
  351. procedure TServerNameProperty.GetValues(Proc: TGetStrProc);
  352. var
  353.   Connection: TConnectionAccess;
  354.   Data: OleVariant;
  355.   i: Integer;
  356. begin
  357.   Screen.Cursor := crHourGlass;
  358.   try
  359.     Connection := TConnectionAccess(GetComponent(0));
  360.     Data := Connection.GetServerList;
  361.     if VarIsArray(Data) then
  362.       for i := 0 to VarArrayHighBound(Data, 1) do
  363.         Proc(Data[i]);
  364.   finally
  365.     Screen.Cursor := crDefault;
  366.   end;
  367. end;
  368.  
  369. type
  370.   TCDSFilenameProperty = class(TStringProperty)
  371.   public
  372.     procedure Edit; override;
  373.     function GetAttributes: TPropertyAttributes; override;
  374.   end;
  375.  
  376. { TFilenameProperty }
  377.  
  378. procedure TCDSFilenameProperty.Edit;
  379. var
  380.   CDSFileOpen: TOpenDialog;
  381. begin
  382.   CDSFileOpen := TOpenDialog.Create(Application);
  383.   CDSFileOpen.Filename := GetValue;
  384.   CDSFileOpen.Filter := SClientDataFilter;
  385.   CDSFileOpen.Options := CDSFileOpen.Options + [ofPathMustExist];
  386.   try
  387.     if CDSFileOpen.Execute then SetValue(CDSFileOpen.Filename);
  388.   finally
  389.     CDSFileOpen.Free;
  390.   end;
  391. end;
  392.  
  393. function TCDSFilenameProperty.GetAttributes: TPropertyAttributes;
  394. begin
  395.   Result := [paDialog, paRevertable];
  396. end;
  397.  
  398. { TCDSFieldLinkProperty }
  399.  
  400. procedure TCDSFieldLinkProperty.Edit;
  401. var
  402.   Opened: Boolean;
  403.   PacketRecords: Integer;
  404. begin
  405.   FCDS := DataSet as TClientDataSet;
  406.   PacketRecords := FCDS.PacketRecords;
  407.   Opened := FCDS.FieldCount = 0;
  408.   try
  409.     if Opened then
  410.     begin
  411.       FCDS.PacketRecords := 0;
  412.       FCDS.Open;
  413.     end;
  414.     inherited Edit;
  415.   finally
  416.     if Opened then
  417.     begin
  418.       FCDS.Close;
  419.       FCDS.PacketRecords := PacketRecords;
  420.     end;
  421.   end;
  422. end;
  423.  
  424. function TCDSFieldLinkProperty.GetIndexFieldNames: string;
  425. begin
  426.   Result := FCDS.IndexFieldNames;
  427. end;
  428.  
  429. function TCDSFieldLinkProperty.GetMasterFields: string;
  430. begin
  431.   Result := FCDS.MasterFields;
  432. end;
  433.  
  434. procedure TCDSFieldLinkProperty.SetIndexFieldNames(const Value: string);
  435. begin
  436.   FCDS.IndexFieldNames := Value;
  437. end;
  438.  
  439. procedure TCDSFieldLinkProperty.SetMasterFields(const Value: string);
  440. begin
  441.   FCDS.MasterFields := Value;
  442. end;
  443.  
  444. { TMidas property category }
  445.  
  446. type
  447.   TMidasCategory = class(TPropertyCategory)
  448.   public
  449.     class function Name: string; override;
  450.     class function Description: string; override;
  451.   end;
  452.  
  453. { TMidasCategory }
  454.  
  455. class function TMidasCategory.Description: string;
  456. begin
  457.   Result := SMidasCategoryDesc;
  458. end;
  459.  
  460. class function TMidasCategory.Name: string;
  461. begin
  462.   Result := SMidasCategoryName;
  463. end;
  464.  
  465. { TSimpleObjectBrokerSprig }
  466.  
  467. function TSimpleObjectBrokerSprig.AnyProblems: Boolean;
  468. begin
  469.   Result := TSimpleObjectBroker(Item).Servers.Count = 0;
  470. end;
  471.  
  472. { TCOMConnectionSprig }
  473.  
  474. function TCOMConnectionSprig.AnyProblems: Boolean;
  475. begin
  476.   Result := (TCOMConnection(Item).ServerGUID = '') and
  477.             (TCOMConnection(Item).ServerName = '');
  478. end;
  479.  
  480. { TDCOMConnectionSprig }
  481.  
  482. class function TDCOMConnectionSprig.ParentProperty: string;
  483. begin
  484.   Result := 'ObjectBroker'; { do not localize }
  485. end;
  486.  
  487. { TSocketConnectionSprig }
  488.  
  489. function TSocketConnectionSprig.AnyProblems: Boolean;
  490. begin
  491.   Result := ((TSocketConnection(Item).Address = '') and
  492.              (TSocketConnection(Item).Host = '') and
  493.              (TSocketConnection(Item).ObjectBroker = nil))
  494.             or
  495.              ((TSocketConnection(Item).ServerName = '') and
  496.               (TSocketConnection(Item).ServerGUID = ''));
  497. end;
  498.  
  499. class function TSocketConnectionSprig.ParentProperty: string;
  500. begin
  501.   Result := 'ObjectBroker'; { do not localize }
  502. end;
  503.  
  504. { TCorbaConnectionSprig }
  505.  
  506. function TCorbaConnectionSprig.AnyProblems: Boolean;
  507. begin
  508.   Result := (TCorbaConnection(Item).HostName = '') or
  509.             (TCorbaConnection(Item).ObjectName = '');
  510. end;
  511.  
  512. { TWebConnectionSprig }
  513.  
  514. function TWebConnectionSprig.AnyProblems: Boolean;
  515. begin
  516.   Result := ((TWebConnection(Item).URL = '')
  517.              and (TWebConnection(Item).ObjectBroker = nil )
  518.             )
  519.             or
  520.             ((TWebConnection(Item).ServerName = '')
  521.               and (TWebConnection(Item).ServerGUID = ''));
  522. end;
  523.  
  524. class function TWebConnectionSprig.ParentProperty: string;
  525. begin
  526.   Result := 'ObjectBroker'; { do not localize }
  527. end;
  528.  
  529. { TDataSetProviderSprig }
  530.  
  531. class function TDataSetProviderSprig.ParentProperty: string;
  532. begin
  533.   Result := 'DataSet'; { do not localize }
  534. end;
  535.  
  536. { TClientDataSetSprig }
  537.  
  538. function TClientDataSetSprig.AnyProblems: Boolean;
  539. begin
  540.   with TClientDataSet(Item) do
  541.     Result := not ((DataSetField <> nil) or
  542.                    ((RemoteServer <> nil) and
  543.                     (ProviderName <> '')) or
  544.                    (ProviderName <> ''));
  545. end;
  546.  
  547. function TClientDataSetSprig.Caption: string;
  548. begin
  549.   with TClientDataSet(Item) do
  550.     if (DataSetField = nil) and
  551.        (RemoteServer <> nil) then
  552.       Result := CaptionFor(ProviderName, Name)
  553.     else
  554.       Result := inherited Caption;
  555. end;
  556.  
  557. function TClientDataSetSprig.DragDropTo(AItem: TSprig): Boolean;
  558. begin
  559.   Result := False;
  560.   with TClientDataSet(Item) do
  561.     if AItem is TFieldSprig then
  562.     begin
  563.       Result := DataSetField <> AItem.Item;
  564.       if Result then
  565.         DataSetField := TDataSetField(AItem.Item);
  566.       RemoteServer := nil;
  567.       ProviderName := '';
  568.     end
  569.     else if AItem is TCustomRemoteServerSprig then
  570.     begin
  571.       Result := RemoteServer <> AItem.Item;
  572.       if Result then
  573.         RemoteServer := TCustomRemoteServer(AItem.Item);
  574.       DataSetField := nil;
  575.     end
  576.     else if AItem is TCustomProviderSprig then
  577.     begin
  578.       Result := ProviderName <> TCustomProvider(AItem.Item).Name;
  579.       if Result then
  580.         ProviderName := TCustomProvider(AItem.Item).Name;
  581.       RemoteServer := nil;
  582.       DataSetField := nil;
  583.     end;
  584. end;
  585.  
  586. function TClientDataSetSprig.DragOverTo(AItem: TSprig): Boolean;
  587. begin
  588.   Result := ((AItem is TFieldSprig) and
  589.              (TFieldSprig(AItem).Item is TDataSetField)) or
  590.             (AItem is TCustomRemoteServerSprig) or
  591.             (AItem is TCustomProviderSprig);
  592. end;
  593.  
  594. procedure TClientDataSetSprig.FigureParent;
  595. begin
  596.   with TClientDataSet(Item) do
  597.     if DataSetField <> nil then
  598.       SeekParent(DataSetField).Add(Self)
  599.     else if RemoteServer <> nil then
  600.       SeekParent(RemoteServer, False).Add(Self)
  601.     else if ProviderName <> '' then
  602.       SeekParent(ProviderName, TCustomProvider).Add(Self)
  603.     else
  604.       inherited;
  605. end;
  606.  
  607. function TClientDataSetSprig.GetDSDesignerClass: TDSDesignerClass;
  608. begin
  609.   Result := TCDSDesigner;
  610. end;
  611.  
  612. class function TClientDataSetSprig.PaletteOverTo(AParent: TSprig;
  613.   AClass: TClass): Boolean;
  614. begin
  615.   Result := ((AParent is TFieldSprig) and
  616.              (TFieldSprig(AParent).Item is TDataSetField)) or
  617.             (AParent is TCustomRemoteServerSprig) or
  618.             (AParent is TCustomProviderSprig);
  619. end;
  620.  
  621. { TClientDataSetIsland }
  622.  
  623. function TClientDataSetIsland.VisibleTreeParent: Boolean;
  624. begin
  625.   with TClientDataSet(Item) do
  626.     Result := (DataSetField = nil) and
  627.               (RemoteServer = nil);
  628. end;
  629.  
  630. { TClientDataSetMasterDetailBridge }
  631.  
  632. function TClientDataSetMasterDetailBridge.CanEdit: Boolean;
  633. begin
  634.   Result := True;
  635. end;
  636.  
  637. function TClientDataSetMasterDetailBridge.Edit: Boolean;
  638. var
  639.   vPropEd: TCDSFieldLinkProperty;
  640. begin
  641.   vPropEd := TCDSFieldLinkProperty.CreateWith(TDataSet(Omega.Item));
  642.   try
  643.     vPropEd.Edit;
  644.     Result := vPropEd.Changed;
  645.   finally
  646.     vPropEd.Free;
  647.   end;
  648. end;
  649.  
  650. class function TClientDataSetMasterDetailBridge.GetOmegaSource(
  651.   AItem: TPersistent): TDataSource;
  652. begin
  653.   Result := TClientDataSet(AItem).MasterSource;
  654. end;
  655.  
  656. class function TClientDataSetMasterDetailBridge.OmegaIslandClass: TIslandClass;
  657. begin
  658.   Result := TClientDataSetIsland;
  659. end;
  660.  
  661. class procedure TClientDataSetMasterDetailBridge.SetOmegaSource(
  662.   AItem: TPersistent; ADataSource: TDataSource);
  663. begin
  664.   TClientDataSet(AItem).MasterSource := ADataSource;
  665. end;
  666.  
  667.  
  668. function TClientDataSetMasterDetailBridge.Caption: string;
  669. begin
  670.   if TClientDataSet(Omega.Item).MasterFields = '' then
  671.     Result := SNoMasterFields
  672.   else
  673.     Result := TClientDataSet(Omega.Item).MasterFields;
  674. end;
  675.  
  676. procedure Register;
  677. begin
  678.   { MIDAS components are only available in the Enterprise SKU }
  679.   if GDAL = 0 then
  680.   begin
  681.     RegisterComponents(srMIDAS, [TClientDataSet, TDCOMConnection,
  682.       TSocketConnection, TDataSetProvider, TSimpleObjectBroker, TWebConnection]);
  683.     // Only register TCorbaConnection for Delphi. Once extra ORBPAS.DLL work is
  684.     // done for Delphi A/S and BCB A/S revert this code.
  685.     if HexDisplayPrefix = '$' then
  686.       RegisterComponents(srMIDAS, [TCorbaConnection]);
  687.  
  688.     { Compatibility components }
  689.     RegisterComponents(srMIDAS, [TRemoteServer, TMIDASConnection, TProvider,
  690.       TOLEnterpriseConnection]);
  691.  
  692.     RegisterPropertyEditor(TypeInfo(string), TDispatchConnection, 'ComputerName', TComputerNameProperty);
  693.     RegisterPropertyEditor(TypeInfo(string), TSocketConnection, 'Host', TComputerNameProperty);
  694.     RegisterPropertyEditor(TypeInfo(string), TOLEnterpriseConnection, 'BrokerName', TComputerNameProperty);
  695.     RegisterPropertyEditor(TypeInfo(string), TCustomRemoteServer, 'ServerName', TServerNameProperty);
  696.     RegisterPropertyEditor(TypeInfo(string), TServerItem, 'ComputerName', TComputerNameProperty);
  697.     RegisterPropertyEditor(TypeInfo(string), TClientDataSet, 'ProviderName', TProviderNameProperty);
  698.     RegisterPropertyEditor(TypeInfo(string), TClientDataSet, 'IndexName', TIndexNameProperty);
  699.     RegisterPropertyEditor(TypeInfo(string), TClientDataSet, 'IndexFieldNames', TIndexFieldNamesProperty);
  700.     RegisterPropertyEditor(TypeInfo(string), TClientDataSet, 'MasterFields', TCDSFieldLinkProperty);
  701.     RegisterPropertyEditor(TypeInfo(string), TClientDataSet, 'FileName', TCDSFileNameProperty);
  702.     RegisterComponentEditor(TClientDataSet, TClientDataSetEditor);
  703.     RegisterCustomModule(TRemoteDataModule, TDataModuleDesignerCustomModule);
  704.     RegisterCustomModule(TMtsDataModule, TDataModuleDesignerCustomModule);
  705.     RegisterCustomModule(TCorbaDataModule, TDataModuleDesignerCustomModule);
  706.  
  707.     { Property Category registration }
  708.     RegisterPropertiesInCategory(TMidasCategory, TDispatchConnection,
  709.       ['ComputerName', 'Host', 'BrokerName', 'ServerName', 'ServerGUID']);
  710.  
  711.     RegisterPropertiesInCategory(TMidasCategory, TServerItem,
  712.       ['ComputerName', 'Port']);
  713.  
  714.     RegisterPropertiesInCategory(TMidasCategory,
  715.       ['FetchOnDemand', 'PacketRecords', 'RemoteServer', 'OnReconcileError']);
  716.  
  717.     RegisterSprigType(TCustomObjectBroker, TCustomObjectBrokerSprig);
  718.     RegisterSprigType(TSimpleObjectBroker, TSimpleObjectBrokerSprig);
  719.  
  720.     RegisterSprigType(TCustomRemoteServer, TCustomRemoteServerSprig);
  721.  
  722.     RegisterSprigType(TDCOMConnection, TDCOMConnectionSprig);
  723.     RegisterSprigType(TOLEnterpriseConnection, TOLEnterpriseConnectionSprig);
  724.     RegisterSprigType(TCorbaConnection, TCorbaConnectionSprig);
  725.     RegisterSprigType(TWebConnection, TWebConnectionSprig);
  726.     RegisterSprigType(TSocketConnection, TSocketConnectionSprig);
  727.  
  728.     RegisterSprigType(TCustomProvider, TCustomProviderSprig);
  729.     RegisterSprigType(TDataSetProvider, TDataSetProviderSprig);
  730.  
  731.     RegisterSprigType(TClientDataSet, TClientDataSetSprig);
  732.  
  733.     RegisterIslandType(TClientDataSetSprig, TClientDataSetIsland);
  734.  
  735.     RegisterBridgeType(TDataSetIsland, TClientDataSetIsland, TClientDataSetMasterDetailBridge);
  736.   end;
  737. end;
  738.  
  739. end.
  740.